package com.example.kotlindemo.modules.todolist

import android.app.Application
import androidx.lifecycle.*
import com.example.kotlindemo.data.AppDatabase
import com.example.kotlindemo.data.Task
import com.example.kotlindemo.data.TaskRepository
import kotlinx.coroutines.launch


// TodoListViewModel
// 管理 UI 相关的数据和逻辑，持有 TaskRepository 的引用。
// 初始化时从 AppDatabase 获取 TaskDao，创建 TaskRepository，并获取 pendingTasks 和 completedTasks 的 LiveData。
// 提供方法处理用户操作：
// addNewTask：插入新任务。
// completeTask：标记任务为完成。
// uncompleteTask：标记任务为未完成。
// updateTaskName：更新任务名称。
// 使用 viewModelScope.launch 确保数据库操作在协程中异步执行。
// 计算 hasCompletedTasks（是否有已完成任务）以支持 UI 动态显示。
class TodoListViewModel(application: Application) : AndroidViewModel(application) {

    private val repository: TaskRepository
    val pendingTasks: LiveData<List<Task>>
    val completedTasks: LiveData<List<Task>>
    val hasCompletedTasks: LiveData<Boolean>

    // 获取 TaskDao（通过 AppDatabase）。
    // 创建 TaskRepository。
    // 初始化 pendingTasks 和 completedTasks 的 LiveData，直接绑定到 TaskRepository 的数据。
    // 计算 hasCompletedTasks（基于 completedTasks 是否为空）。
    init {
        try {
            val taskDao = AppDatabase.getDatabase(application).taskDao() // 创建单例数据库实例
            repository = TaskRepository(taskDao)
            pendingTasks = repository.pendingTasks
            completedTasks = repository.completedTasks
            hasCompletedTasks = completedTasks.map { completedList ->
                !completedList.isNullOrEmpty()
            }
        } catch (e: Exception) {
            throw RuntimeException("Failed to initialize TodoListViewModel: ${e.message}", e)
        }
    }

    fun addNewTask(taskName: String) {
        if (taskName.isNotBlank()) {
            viewModelScope.launch {
                try {
                    repository.insert(taskName)
                } catch (e: Exception) {
                    // 可以在这里添加错误处理，例如通过 LiveData 通知 UI
                }
            }
        }
    }

    fun completeTask(task: Task) {
        viewModelScope.launch {
            try {
                repository.markTaskAsCompleted(task)
            } catch (e: Exception) {
                // 可以在这里添加错误处理
            }
        }
    }

    fun uncompleteTask(task: Task) {
        viewModelScope.launch {
            try {
                repository.markTaskAsPending(task)
            } catch (e: Exception) {
                // 可以在这里添加错误处理
            }
        }
    }

    fun updateTaskName(task: Task, newName: String) {
        if (newName.isNotBlank() && task.name != newName) {
            viewModelScope.launch {
                try {
                    val taskToUpdate = task.copy(name = newName)
                    repository.update(taskToUpdate)
                } catch (e: Exception) {
                    // 可以在这里添加错误处理
                }
            }
        }
    }
}